package service

import (
	"context"

	"Data-API-MCP/backend/internal/domain/entity"
	"Data-API-MCP/backend/internal/domain/repository"
	"errors"
)

// ServiceService MCP服务领域服务
type ServiceService struct {
	serviceRepo    repository.ServiceRepository
	connectionRepo repository.ConnectionRepository
}

// NewServiceService 创建服务服务
func NewServiceService(serviceRepo repository.ServiceRepository, connectionRepo repository.ConnectionRepository) *ServiceService {
	return &ServiceService{
		serviceRepo:    serviceRepo,
		connectionRepo: connectionRepo,
	}
}

// CreateService 创建服务
func (s *ServiceService) CreateService(ctx context.Context, service *entity.Service) error {
	// 检查连接是否存在
	if _, err := s.connectionRepo.FindByID(ctx, service.ConnectionID); err != nil {
		return errors.New("数据库连接不存在")
	}

	// 检查服务名称是否已存在
	if _, err := s.serviceRepo.FindByName(ctx, service.Name); err == nil {
		return errors.New("服务名称已存在")
	}

	return s.serviceRepo.Create(ctx, service)
}

// UpdateService 更新服务
func (s *ServiceService) UpdateService(ctx context.Context, service *entity.Service) error {
	// 检查服务是否存在
	if _, err := s.serviceRepo.FindByID(ctx, service.ID); err != nil {
		return errors.New("服务不存在")
	}

	// 检查连接是否存在
	if _, err := s.connectionRepo.FindByID(ctx, service.ConnectionID); err != nil {
		return errors.New("数据库连接不存在")
	}

	return s.serviceRepo.Update(ctx, service)
}

// DeleteService 删除服务
func (s *ServiceService) DeleteService(ctx context.Context, id string) error {
	// 检查服务是否存在
	if _, err := s.serviceRepo.FindByID(ctx, id); err != nil {
		return errors.New("服务不存在")
	}

	return s.serviceRepo.Delete(ctx, id)
}

// GetService 获取服务
func (s *ServiceService) GetService(ctx context.Context, id string) (*entity.Service, error) {
	return s.serviceRepo.FindByID(ctx, id)
}

// GetServiceList 获取服务列表
func (s *ServiceService) GetServiceList(ctx context.Context, offset, limit int) ([]*entity.Service, error) {
	return s.serviceRepo.List(ctx, offset, limit)
}

// GetServiceCount 获取服务总数
func (s *ServiceService) GetServiceCount(ctx context.Context) (int64, error) {
	return s.serviceRepo.Count(ctx)
}

// GetServiceListByConnection 获取指定连接的服务列表
func (s *ServiceService) GetServiceListByConnection(ctx context.Context, connectionID string, offset, limit int) ([]*entity.Service, error) {
	return s.serviceRepo.ListByConnection(ctx, connectionID, offset, limit)
}

// GetServiceCountByConnection 获取指定连接的服务总数
func (s *ServiceService) GetServiceCountByConnection(ctx context.Context, connectionID string) (int64, error) {
	return s.serviceRepo.CountByConnection(ctx, connectionID)
}

// TestService 测试服务
func (s *ServiceService) TestService(ctx context.Context, service *entity.Service) error {
	// 检查服务是否存在
	if _, err := s.serviceRepo.FindByID(ctx, service.ID); err != nil {
		return errors.New("服务不存在")
	}

	// 检查连接是否存在
	connection, err := s.connectionRepo.FindByID(ctx, service.ConnectionID)
	if err != nil {
		return errors.New("数据库连接不存在")
	}

	// 测试连接
	return s.connectionRepo.TestConnection(ctx, connection)
}
